package main

import (
	"fmt"
	"strings"
)

func main() {
	//Golang map详解
	//map的介绍
	//map是一种无序的基于key-value的数据结构，Go语言中的map是引用类型，必须初始化才能使用。
	//
	//Go语言中map的定义语法如下：
	//
	//map[KeyType]ValueType

	//其中：
	//
	//KeyType：表示键的类型
	//ValueType：表示键对应的值的类型
	//map类型的变量默认初始值为nil，需要使用make()函数来分配内存。语法为：
	//我们尝试一下使用一个没有被初始化的map会发生什么事情 他是一个nil类型
	var testmap map[int]int
	fmt.Println(testmap == nil)
	//make：用于slice、map和channel的初始化 创建方式1
	map1 := make(map[string]string)
	map1["name"] = "zhangjiahong"
	map1["age"] = "20"
	map1["sex"] = "男"
	fmt.Printf("%v\n", map1)
	fmt.Printf("%v\n", map1["name1"])
	//	创建方式2map也支持声明的时候填充元素
	map2 := map[string]string{
		"name": "zhangjiahong",
		"age":  "20",
		"sex":  "男",
	}
	fmt.Println(map2)

	//遍历map
	//使用for range遍历
	for k, v := range map2 {
		fmt.Printf("data[%v]=%v\n", k, v)
	}

	//判断map中某个键值是否存在
	//我们在获取map的时候，会返回两个值，也可以是返回的结果，一个是是否有该元素
	// 判断是否存在,如果存在  ok = true，否则 ok = false
	v, ok := map1["age"]
	fmt.Println(v, ok)

	//使用delete()函数删除键值对
	//使用delete()内建函数从map中删除一组键值对，delete函数的格式如下所示
	//
	//delete(map 对象, key)
	//其中：
	//map对象：表示要删除键值对的map对象
	//key：表示要删除的键值对的键
	delete(map2, "age")
	fmt.Println(map2)

	//元素为map类型的切片
	//我们想要在切片里面存放一系列用户的信息，这时候我们就可以定义一个元素为map类型的切片
	//	首先创建切片
	slice1 := make([]map[string]string, 3)
	sMap1 := map[string]string{
		"name": "zhangjiahong1",
		"age":  "21",
		"sex":  "男",
	}
	sMap2 := map[string]string{
		"name": "zhangjiahong2",
		"age":  "22",
		"sex":  "男",
	}
	sMap3 := map[string]string{
		"name": "zhangjiahong3",
		"age":  "23",
		"sex":  "男",
	}
	slice1[0] = sMap1
	slice1[1] = sMap2
	slice1[2] = sMap3
	fmt.Println(slice1)
	//	我们尝试遍历一下这个切片
	for k, v := range slice1 {
		fmt.Printf("data[%v]=%v\n", k, v)
	}

	//值为切片类型的map
	//我们可以在map中存储切片
	map3 := make(map[string][]string)
	map3["hobby"] = []string{"吃饭", "睡觉", "看书"}
	fmt.Println(map3)
	//	尝试另一种方式
	map4 := make(map[string][]string)
	slice4 := make([]string, 5)
	slice4[0] = "aaaa"
	map4["a"] = slice4
	fmt.Println(map4)
	//	统计一段话中 每个子出现得次数
	word := "你 好 我 好 大 家 好 你 们 好 我 很 好"
	array := strings.Split(word, "")
	fmt.Println(array)
	map5 := make(map[string]int)
	for _, v := range array {
		_, ok := map5[v]
		if ok {
			map5[v] = map5[v] + 1
		} else {
			map5[v] = 1
		}
	}
	fmt.Println(map5)
}
